#pragma once

#include <type_traits>
#include <utility>

namespace std
{

template <typename T, typename F>
constexpr auto _has_member_impl(F&& f) -> decltype(f(::std::declval<T>()), true)
{
    return true;
}

template <typename>
constexpr bool _has_member_impl(...)
{
    return false;
}

template <typename T>
struct is_pair : ::std::false_type
{
};

template <typename K, typename V>
struct is_pair<::std::pair<K, V>> : ::std::true_type
{
};

template <typename K, typename V>
struct is_pair<const ::std::pair<K, V>> : ::std::true_type
{
};

}

#define has_member(T, EXPR) ::std::_has_member_impl<T>([](auto&& obj) -> decltype(obj.EXPR) {})
